﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Transactions;
using ThanNhanTao.Server.Entities;
using System.Data;
using System.Data.SqlClient;
using System.Data.Objects.SqlClient;

namespace ThanNhanTao.Server.BLL
{
    public partial class ChiDinhBLL
    {
        bvdn_thannhantaoEntities entities;
        public ChiDinhBLL()
        {
            entities = ThanNhanTaoGlobalServer.bvdn_thannhantaoEntities;
        }

        public List<ChiDinh> RetrieveChiDinhNgoaiTru(int idBenhNhan, DateTime ngayYeuCau)
        {
            DateTime thoiGianBatDau = Convert.ToDateTime(ngayYeuCau.ToShortDateString() + " 00:00:01");
            DateTime thoiGianKetThuc = Convert.ToDateTime(ngayYeuCau.ToShortDateString() + " 23:59:59");
            List<ChiDinh> listChiDinh = (from chiDinh in entities.ChiDinhs
                                            .Include("Dm_YeuCau")
                                            .Include("Dm_YeuCau.Dm_LoaiYeuCau")
                                            .Include("Dm_DonViTinh")
                                             where chiDinh.IdBenhNhan == idBenhNhan
                                                    && chiDinh.ChoNoiTru
                                                    && chiDinh.NgayYeuCau < thoiGianKetThuc
                                                    && chiDinh.NgayYeuCau >= thoiGianBatDau
                                             select chiDinh).ToList();
            return listChiDinh;
        }

        public List<ChiDinh> RetrieveChiDinhNoiTru(int idBenhNhan, DateTime tuNgay, DateTime denNgay)
        {
            DateTime thoiGianBatDau = Convert.ToDateTime(tuNgay.ToShortDateString() + " 00:00:01");
            DateTime thoiGianKetThuc = Convert.ToDateTime(denNgay.ToShortDateString() + " 23:59:59");
            List<ChiDinh> listChiDinh = (from chiDinh in entities.ChiDinhs
                                            .Include("Dm_YeuCau")
                                            .Include("Dm_DonViTinh")
                                         where chiDinh.IdBenhNhan == idBenhNhan
                                                && !chiDinh.ChoNoiTru
                                                && chiDinh.NgayYeuCau < thoiGianKetThuc
                                                && chiDinh.NgayYeuCau >= thoiGianBatDau
                                         select chiDinh).ToList();
            return listChiDinh;
        }

        public List<PhieuThanhToanNgoaiTruEntities> InPhieuPhieuThanhToanNgoaiTru(int idBenhNhan, DateTime ngayYeuCau)
        {
            DateTime thoiGianBatDau = Convert.ToDateTime(ngayYeuCau.ToShortDateString() + " 00:00:00");
            DateTime thoiGianKetThuc = Convert.ToDateTime(ngayYeuCau.ToShortDateString() + " 23:59:59");
            List<PhieuThanhToanNgoaiTruEntities> listPhieu = (from chiDinh in entities.ChiDinhs
                                                                .Include("Dm_YeuCau")
                                                                .Include("Dm_DonViTinh")
                                                                .Include("Dm_YeuCau.Dm_LoaiYeuCau")
                                                            where chiDinh.IdBenhNhan == idBenhNhan
                                                                    && chiDinh.ChoNoiTru
                                                                    && chiDinh.NgayYeuCau < thoiGianKetThuc
                                                                    && chiDinh.NgayYeuCau >= thoiGianBatDau
                                                            select new PhieuThanhToanNgoaiTruEntities
                                                            {
                                                                MaYeuCau = chiDinh.MaYeuCau,
                                                                TenYeuCau = chiDinh.Dm_YeuCau.TenYeuCau,
                                                                MaLoaiYeuCau = chiDinh.Dm_YeuCau.Dm_LoaiYeuCau.MaLoaiYeuCau,
                                                                TenLoaiYeuCau = chiDinh.Dm_YeuCau.Dm_LoaiYeuCau.TenLoaiYeuCau,
                                                                SoLuong = chiDinh.SoLuong,
                                                                ThanhTien = chiDinh.GiaYeuCau * chiDinh.SoLuong,
                                                                TenDonViTinh = chiDinh.Dm_DonViTinh.TenDonViTinh,
                                                                GiaYeuCau = chiDinh.GiaYeuCau,
                                                                PhanLoaiBHYT = chiDinh.PhanLoaiBHYT,
                                                                //QuyBHYT = chiDinh.QuyBHYT * chiDinh,
                                                                //GiaKhac = chiDinh.GiaKhac * chiDinh.GiaKhac,
                                                                //NguoiBenh = (chiDinh.GiaYeuCau * chiDinh.SoLuong) - chiDinh.QuyBHYT * chiDinh.SoLuong
                                                                //                                                  - chiDinh.GiaKhac * chiDinh.GiaKhac
                                                            }).ToList();

            return listPhieu;
        }

        public List<PhieuThanhToanNoiTruEntities> InPhieuPhieuThanhToanNoiTru(int idBenhNhan, DateTime tuNgay, DateTime denNgay
                                                                                ,out DateTime? ngayChayThanDauTien, out DateTime? ngayChayThanSauCung
                                                                                , out int tongSoNgayDieuTri)
        {
            DateTime thoiGianBatDau = Convert.ToDateTime(tuNgay.ToShortDateString() + " 00:00:00");
            DateTime thoiGianKetThuc = Convert.ToDateTime(denNgay.ToShortDateString() + " 23:59:59");
            List<PhieuThanhToanNoiTruEntities> listPhieu = (from chiDinh in entities.ChiDinhs
                                                                .Include("Dm_YeuCau")
                                                                .Include("Dm_DonViTinh")
                                                                .Include("Dm_YeuCau.Dm_LoaiYeuCau")
                                                              where chiDinh.IdBenhNhan == idBenhNhan
                                                                      && !chiDinh.ChoNoiTru
                                                                      && chiDinh.NgayYeuCau < thoiGianKetThuc
                                                                      && chiDinh.NgayYeuCau >= thoiGianBatDau
                                                              select new PhieuThanhToanNoiTruEntities
                                                              {
                                                                  MaYeuCau = chiDinh.MaYeuCau,
                                                                  TenYeuCau = chiDinh.Dm_YeuCau.TenYeuCau,
                                                                  MaLoaiYeuCau = chiDinh.Dm_YeuCau.Dm_LoaiYeuCau.MaLoaiYeuCau,
                                                                  TenLoaiYeuCau = chiDinh.Dm_YeuCau.Dm_LoaiYeuCau.TenLoaiYeuCau,
                                                                  SoLuong = chiDinh.SoLuong,
                                                                  ThanhTien = chiDinh.GiaYeuCau * chiDinh.SoLuong,
                                                                  TenDonViTinh = chiDinh.Dm_DonViTinh.TenDonViTinh,
                                                                  GiaYeuCau = chiDinh.GiaYeuCau,
                                                                  PhanLoaiBHYT = chiDinh.PhanLoaiBHYT,
                                                                  LaChayThan = chiDinh.LaChayThan,
                                                                  NgayYeuCau = chiDinh.NgayYeuCau,
                                                                  //QuyBHYT = chiDinh.QuyBHYT * chiDinh,
                                                                  //GiaKhac = chiDinh.GiaKhac * chiDinh.GiaKhac,
                                                                  //NguoiBenh = (chiDinh.GiaYeuCau * chiDinh.SoLuong) - chiDinh.QuyBHYT * chiDinh.SoLuong
                                                              }).ToList();
            List<PhieuThanhToanNoiTruEntities> listChayThan = listPhieu.Where(u => u.LaChayThan).ToList();
            ngayChayThanDauTien = null;
            ngayChayThanSauCung = null;
            if (listPhieu.Count > 0)
            {
                PhieuThanhToanNoiTruEntities lanChayThanDauTien = listPhieu.OrderBy(u => u.NgayYeuCau).FirstOrDefault();
                PhieuThanhToanNoiTruEntities lanChayThanSauCung = listPhieu.OrderByDescending(u => u.NgayYeuCau).FirstOrDefault();
                if (lanChayThanDauTien != null)
                    ngayChayThanDauTien = Convert.ToDateTime(lanChayThanDauTien.NgayYeuCau);
                if (lanChayThanSauCung != null)
                    ngayChayThanSauCung = Convert.ToDateTime(lanChayThanSauCung.NgayYeuCau);
                //PhieuThanhToanNoiTruEntities lanChayThanDauTien = listChayThan.OrderBy(u => u.NgayYeuCau).FirstOrDefault();
                //PhieuThanhToanNoiTruEntities lanChayThanSauCung = listChayThan.OrderByDescending(u => u.NgayYeuCau).FirstOrDefault();
                //if (lanChayThanDauTien != null)
                //    ngayChayThanDauTien = Convert.ToDateTime(lanChayThanDauTien.NgayYeuCau);
                //if (lanChayThanSauCung != null)
                //    ngayChayThanSauCung = Convert.ToDateTime(lanChayThanSauCung.NgayYeuCau);
            }
            //else
            //{
            //    PhieuThanhToanNoiTruEntities lanChayThanDauTien = listPhieu.OrderBy(u => u.NgayYeuCau).FirstOrDefault();
            //    PhieuThanhToanNoiTruEntities lanChayThanSauCung = listPhieu.OrderByDescending(u => u.NgayYeuCau).FirstOrDefault();
            //    if (lanChayThanDauTien != null)
            //        ngayChayThanDauTien = Convert.ToDateTime(lanChayThanDauTien.NgayYeuCau);
            //    if (lanChayThanSauCung != null)
            //        ngayChayThanSauCung = Convert.ToDateTime(lanChayThanSauCung.NgayYeuCau);
            //}
            tongSoNgayDieuTri = 0;//listPhieu.GroupBy(u => u.NgayYeuCau).Count();
            var listChayThanGroup = from a in listChayThan
                                    group a by new
                                    {
                                        a.MaYeuCau,
                                        a.GiaYeuCau,
                                        a.SoLuong,
                                    } into gro
                                    select new
                                    {
                                        MaYeuCau = gro.Key.MaYeuCau,
                                        GiaYeuCau = gro.Key.GiaYeuCau,
                                        SoLuong = gro.Sum(a => a.SoLuong).GetValueOrDefault(0),
                                    };

            List<PhieuThanhToanNoiTruEntities> listChayThanFinal = new List<PhieuThanhToanNoiTruEntities>();
            foreach (var itemMock in listChayThanGroup)
            {
                int soLuongSumChayThan = itemMock.SoLuong; 
                PhieuThanhToanNoiTruEntities listnew = new PhieuThanhToanNoiTruEntities();
                string yeuCauChayThanString = string.Empty;
                foreach (PhieuThanhToanNoiTruEntities item in listChayThan.Where(u => u.MaYeuCau == itemMock.MaYeuCau && u.GiaYeuCau == itemMock.GiaYeuCau))
                {
                    listnew = item;
                    if (!string.IsNullOrEmpty(yeuCauChayThanString)) //Đã có thiết lập chạy thận trước đó thì hiển thị cộng tiếp vào
                        yeuCauChayThanString += ", " + item.NgayYeuCau.ToString("dd/MM");
                    else //Chưa thiết lập thì thiết lập tên chạy thận cộng với ngày chạy thận
                        yeuCauChayThanString = item.TenYeuCau + " " + item.NgayYeuCau.ToString("dd/MM");
                }
                listnew.TenYeuCauChayThan = yeuCauChayThanString;
                listnew.SoLuong = itemMock.SoLuong;
                listnew.ThanhTien = soLuongSumChayThan * itemMock.GiaYeuCau;
                listChayThanFinal.Add(listnew);
            }

            if (listChayThanFinal.Count > 0) //Nếu đã thiết lập được các nhóm chạy thận rồi thì hiển add vào list chính
            {
                listPhieu.RemoveAll(u => u.LaChayThan);
                listPhieu.AddRange(listChayThanFinal);
            }

            return listPhieu;
        }

        public void SaveChiDinhNgoaiTru(List<int> listIdChiDinhXoa, List<ChiDinh> listChiDinh, DateTime ngayThanhToan)
        {
            foreach (int Id in listIdChiDinhXoa)
            {
                int? idChayThanhNhanTao = null;
                ChiDinh chiDinhXoa = (from chidinh in entities.ChiDinhs
                                      where chidinh.IdChiDinh == Id
                                      select chidinh).First();
                idChayThanhNhanTao = chiDinhXoa.IdChayThanNhanTao; //lấy Id chạy thận trước khi xóa chỉ định
                entities.DeleteObject(chiDinhXoa);
                entities.SaveChanges();
                if (idChayThanhNhanTao != null)
                {
                    ChayThanNhanTao chayThan = (from chay in entities.ChayThanNhanTaos
                                                where chay.IdChayThanNhanTao == idChayThanhNhanTao
                                                select chay).First();
                    entities.DeleteObject(chayThan);
                    entities.SaveChanges();
                }
            }

            foreach (ChiDinh item in listChiDinh)
            {
                if (item.IdChiDinh == 0)
                {
                    item.IdChiDinh = GetSoIDMax() + 1;
                    item.NgayYeuCau = ngayThanhToan;
                    entities.AddToChiDinhs(item);
                    entities.SaveChanges();
                }
                else
                {
                    ChiDinh chiDinh = (from chi in entities.ChiDinhs
                                       where chi.IdChiDinh == item.IdChiDinh
                                       select chi).First();
                    chiDinh.SoLuong = item.SoLuong;
                    chiDinh.TenDonViTinh = item.TenDonViTinh;
                    chiDinh.TenYeuCau = item.TenYeuCau;
                    entities.SaveChanges();
                }
            }
        }

        public void SaveChiDinhNoiTru(List<int> listIdChiDinhXoa, List<ChiDinh> listChiDinh,DateTime ngayThanhToan, ref List<DateTime> listNgayYeuCau)
        {
            foreach (int Id in listIdChiDinhXoa)
            {
                int? idChayThanhNhanTao = null;
                ChiDinh chiDinhXoa = (from chidinh in entities.ChiDinhs
                                      where chidinh.IdChiDinh == Id
                                      select chidinh).First();
                idChayThanhNhanTao = chiDinhXoa.IdChayThanNhanTao; //lấy Id chạy thận trước khi xóa chỉ định
                if (chiDinhXoa.LaChayThan)
                    listNgayYeuCau.Add(chiDinhXoa.NgayYeuCau);
                entities.DeleteObject(chiDinhXoa);
                entities.SaveChanges();
                if (idChayThanhNhanTao != null)
                {
                    ChayThanNhanTao chayThan = (from chay in entities.ChayThanNhanTaos
                                                where chay.IdChayThanNhanTao == idChayThanhNhanTao
                                               select chay).First();
                    entities.DeleteObject(chayThan);
                    entities.SaveChanges();
                }
            }

            foreach (ChiDinh item in listChiDinh)
            {
                if (item.IdChiDinh == 0)
                {
                    item.IdChiDinh = GetSoIDMax() + 1;
                    item.NgayYeuCau = ngayThanhToan;
                    entities.AddToChiDinhs(item);
                    entities.SaveChanges();
                }
                else
                {
                    ChiDinh chiDinh = (from chi in entities.ChiDinhs
                                       where chi.IdChiDinh == item.IdChiDinh
                                       select chi).First();
                    chiDinh.SoLuong = item.SoLuong;
                    chiDinh.TenDonViTinh = item.TenDonViTinh;
                    chiDinh.TenYeuCau = item.TenYeuCau;
                    entities.SaveChanges();
                }
            }
        }

        public int GetSoIDMax()
        {
            try
            {
                return entities.ChiDinhs.Max(u => u.IdChiDinh);
            }
            catch
            {
                return 0;
            }
        }
    }
}
